package com.mes.schedule.manager.iface;

import java.util.List;

import com.mes.schedule.domain.SDevice;
import com.mes.schedule.domain.SOperationTask;
import com.mes.schedule.domain.TaskAssignScheme;
import com.mes.schedule.manager.PreAssignResult;

/**
 * 分派
 * @author Administrator  
 * @version   
 * @since JDK 1.6
 */
public interface IAssignManager {	
	
	/**
	 * assign the task according to the resource constraint
	 * @param operTask
	 * @return
	 */
	public PreAssignResult doAssignTask(SOperationTask operationTask) throws Exception;
	
	/**
	 * start task assign
	 * @param operTask
	 * @return
	 */
	public void assignTask(SOperationTask operationTask) throws Exception;
	
	/**
	 * 取消工序任务分派
	 * @param operationTask
	 * @throws Exception
	 */
	public void cancelAssignTask(SOperationTask operationTask,boolean cascadeSucc) throws Exception;

	
	/**
	 * 工序分配后处理
	 */
	public void afterAssign(SOperationTask operationTask) throws Exception;
	/**
	 * 预分配任务，主要用于多线程
	 */
	public void preAssnTask(TaskAssignScheme alterResource)  throws Exception;
	/**
	 * 预分配完成后的回调函数，主要用于多线程
	 */
	public void preAssnTaskCallBack(TaskAssignScheme alterResource);

	/**
	 * 从待调度任务中移除
	 */
	public void removeFromReadyTasks(SOperationTask  operationTask);
	/**
	 * 任务右移
	 * @param operationTask
	 */
	void moveRight(SOperationTask operationTask)  throws Exception;

	/**
	 * 从待调度任务中移除
	 */
	public void addToReadyTasks(SOperationTask operationTask);

	public List<SDevice> getAlterDeviceList(SOperationTask operationTask);
}
